4.9. Merkkijonot

Tcl-kielessä merkkijonojen (engl. string) käytössä tulee muistaa, että merkkijonojen päätösmerkkinä käytetään nollaa (0), joten merkki jonoon ei siis voi tallentaa nollaa. Merkkijonoja voi käsitellä komennoilla append, scan, format, string, regexp ja regsub [WEL97W].

string-komennolla on useita käytettävissä olevia optioita. index-optiolla merkkijonosta voi poistaa halutusta kohdasta merkin. Tällöin on muistettava, ett& auml; merkkijonon ensimmäinen merkki on paikassa 0. Optiolla length saadaan selville merkkijonon pituus, trim-optiolla taas merkkijonosta voidaan poistaa ylimääräiset välily& ouml;nnit jonon alusta ja lopusta. Muita optioita ovat compare, first, last, range, tolower, toupper, trimleft ja trimright [WEL97W].

Esimerkissä

set jono "Jononen "

;#merkkijonon lopussa on kuusi välilyöntiä

string index jono 0

set jono

=>"ononen "

string length jono

=> 12

string trim jono

=>"ononen"

poistetaan ensin jono-merkkijonosta sen ensimmäinen kirjain, jonka jälkeen tiedustellaan jono-muuttujan pituutta. Viimeiseksi poistetaan turhat välilyönnit trim-optiolla .

match-optiolla voidaan testata täsmääkö merkkijono annettuun malliin (engl. pattern). Jos tutkittava merkkijono täsmää malliesimerkin kanssa, palauttaa string-komento arvon 1. Mallissa voidaan antaa merkkejä ja ns. jokerimerkkejä. Jokerimerkkejä ovat tähti (*) ja kysymysmerkki (?), joista * vastaa nollaa tai useampaa mitä tahansa merkkiä ja ? vastaa yhtä mitä tahansa merkkiä. voidaan myös antaa ehtoina vaihtoehtoja merkeistä, jotka annetaan hakasulkeiden ( [abc]) avulla. Lisäksi kenoviivalla (\)voidaan antaa malliin erikoismerkki kuten *, ?, [,] tai \. Esimerkin

set jono "Kysymys?"

string match Ky* jono

=>1

string match K*\? jono

=>1

string match [LKM]?sym* jono

=>1

kaikki match-optiolle annetut mallit täsmäävät sanan Kysymys? kanssa.

Merkkijonoja voidaan liittää toisiinsa append-komennolla. Sille voi antaa parametreina useamman merkkijonon ja se palauttaa arvonaan yhdistämänsä merkkijonon, kuten seuraavassa esimer kissä:

set jono "hop"

append "hip" jono "heijjaa"

=>hiphopheijjaa

Format-komennolla voi merkkijonoja muokata samalla tavalla kuin ANSI C -kielen sprintf-komennolla. Esimerkin

set luku 5

set jono [format "x%3dx%2dx%1dx" $luku $luku $luku]

=>x 5x 5x5x

 

set desimluku 11.8147564

set jono [format "Desimaaliluku %3.2f kahdella \

desimaalilla" $desimluku]

=>Desimaaliluku 11.81 kahdella desimaalilla

ensimmäistä format-komentoa oli käytetty tulostuksen ulkoasun muokkaamiseen, johon se soveltuukin hyvin. Toisella format-komennolla on määrätty esitettävien desimaalien määrä.

scan-komennolla voi merkkijonosta lukea tietyllä formaatilla arvoja muuttujiin. Esimerkissä

scan "22 arvo, 35.89 toinen arvo" "%d arvo, %f" a b

set a

=>22

set b

=>35.89

luetaan merkkijonosta 22 arvo, 35.89 toinen arvo luvut muuttujiin a ja b. Muuttujan a arvoksi tulee ensimmäinen merkkijonosta l& ouml;ytyvä luku ja muuttujan b arvoksi toinen luku.

regexp-komennolla voi merkkijonoja käsitellä käyttäen apuna säännöllisiä lausekkeita (engl. regular expressions). Tällöin voidaan määrät ä esimerkiksi, kuinka monta kertaa jokin tietty ehto voi toteutua merkkijonossa sekä pystytään määräämään merkkijonon alku- ja loppupaikat. Komento palauttaa arvon 1, jos merkki jono vastaa säännöllistä lauseketta, ja arvon 0 muuten. Seuraava esimerkki havainnollistanee sitä hieman:

regexp {^[0-9]+$} 490

=>1

regexp {^[0-9]+$} -490

=>0

Hattumerkki (^) merkitsee merkkijonon alkua ja dollarimerkki ($) vastaavasti merkkijono loppua. Hakasulkeissa voidaan antaa haluttuja merkkejä joko yksitellen ([123456789]) tai sitten ilmaistuna sarjana väliviivan avulla ([1-9]). Plusmerkillä (+) tarkoitetaan sitä, että edellinen osio voi toistua yhden tai useamman ke rran. Tähti (*) puolestaan tarkoittaa samaa, mutta esiintymiä ei tarvitse olla välttämättä ollenkaan. Piste vastaa yhtä mitä tahansa merkkiä. Kenoviivalla (\ saadaan lausekkeeseen mikä tahansa merkki mukaan ilman sen erikoismerkitystä (\?). Taulukkoon 4.4 on listattu muutamia hyödyllisiä säännöllisiä lausekkeita.

{^[kK]}

Alkaa K-kirjaimella (tai k), kuten Kyllä vastaus.

{^(ei|Ei|EI)$}

Tarkalleen joko ei, Ei tai EI.

"^\[ \t]*$"

Tyhjä rivi.

{^[A-Za-z]+$}

Sisältää vain kirjaimia.

{^[A-Za-z0-9_]+$}

Kirjaimia, numeroita ja alaviivoja.

{[][${}\\]}

Sisältää Tcl -kielen erikoismerkit ] [ $ { } \.

"\[^\n\]*\n"

Koko rivi rivinvaihtoon asti.

{\.}

Piste.

{[][$^\?\+\*\(\)\|\\}

Sisältää säännöllisten lausekkeiden erikoismerkit ] [ $ ^ ? + * ( ) |\ .

"(^|\n)A:\[^\n\]+\n"

Rivi joka alkaa "A:":lla. (^|\n) tarkoittaa merkkijonon alkua tai rivinvaihtoa ennen riviä.

Taulukko 4.4. Hyödyllisiä säännöllisiä lausekkeita.

resub-komennolla voi merkkijonosta korvata osan annetulla merkkijonolla, esimerkiksi seuraavalla tavalla:

regsub x "Korvataan x x jollakin muulla x" yy jono

set jono

=>Korvataan yy yy jollakin muulla yy

 


previous gif next gif
Luk-tutkielma: Tcl/Tk -opiksi ja iloksi.